import { TMap } from '../map'
import { Point } from '../entity/point'

import { ControlPositionEnum } from './enum'

export interface ControlOptions {
    /**
     * 控件的停靠位置
     */
    position: ControlPositionEnum
}

/**
 * 此类是所有控件类的基类，你可以通过此类来自定义控件，所有控件均包含 `Control` 类的属性、方法和事件
 */
export interface Control {
    readonly options: ControlOptions;

    /**
     * 设置控件的位置
     */
    setPosition: (position: ControlPositionEnum) => void;

    /**
     * 返回控件的位置
     */
    getPosition: () => ControlPositionEnum;

    /**
     * 向地图上添加叠加物。
     * 当调用 `TMap.addControl()` 时，`API` 将调用此方法。
     * 自定义控件时需要实现此方法。
     * 自定义控件时需要将控件对应的HTML元素返回
     */
    onAdd: (map: TMap) => void;

    /**
     * 移除控件，释放控件对象所占用的内存。
     * 自定义控件时需要实现此方法
     */
    onRemove: () => void;

    /**
     * 返回控件所在的容器的标签
     */
    getContainer: () => HTMLElement;

    /**
     * 显示控件
     */
    show: () => void;

    /**
     * 隐藏控件
     */
    hide: () => void;

    /**
     * 判断控件的可见性
     */
    isVisible: () => void;

    /**
     * 判断控件的可见性
     */
    setOffset: (offset: Point) => void;

    /**
     * 返回控件停靠的偏移量
     */
    getOffset: () => Point;

    /**
     * 对 `ControlOptions` 属性值赋值
     */
    setOptions: (opts: ControlOptions) => void;
}
